package com.winning.algorithm.algorithmbank.hao19_03;

/**
 * @author Hao.Y
 *
 * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 * 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * 输出：7 -> 0 -> 8
 * 原因：342 + 465 = 807
 */
public class Demo_19_02 {

    public static void main(String[] args) {
        ListNode l11 = new ListNode(2);
        ListNode l12 = new ListNode(4);
        ListNode l13 = new ListNode(3);
        ListNode l21 = new ListNode(5);
        ListNode l22 = new ListNode(6);
        ListNode l23 = new ListNode(4);

        //2 -> 4 -> 3
        l12.next = l13;
        l11.next = l12;

        //5 -> 6 ->4
        l22.next = l23;
        l21.next = l22;

        ListNode result = handle(l11, l21);

        while(result != null){
            System.out.println(result.val);
            result = result.next;
        }

    }

    public static ListNode handle(ListNode l1, ListNode l2) {
        //创建一个新的Node
        ListNode head = new ListNode(0);
        int result = 0;
        ListNode current = head;

        //如果两个节点只要有一个不为null，则继续循环
        while(l1 != null || l2 != null){
            //获取对应的值
            int x = (l1 != null) ? l1.val : 0;
            int y = (l2 != null) ? l2.val : 0;

            //求和
            int sum = result + x + y;

            //result进入下轮循环
            result = sum / 10;

            //该节点的值
            current.next = new ListNode(sum % 10);

            current = current.next;

            if(l1 != null){
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }

        if(result >0){
            current.next = new ListNode(result);
        }

        return head.next;
    }

}

class ListNode{
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}
